home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / pyshared / GDebi / KDEAptDialogs.py < prev    next >
Text File  |  2008-08-05  |  8KB  |  243 lines

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # Copyright (c) 2005-2007 Martin B├╢hm
  5. # Copyright (c) 2008 Canonical Ltd
  6. #
  7. # AUTHOR:
  8. # Martin B├╢hm <martin.bohm@ubuntu.com>
  9. #
  10. # This file is part of GDebi
  11. #
  12. # GDebi is free software; you can redistribute it and/or
  13. # modify it under the terms of the GNU General Public License as published
  14. # by the Free Software Foundation; either version 2 of the License, or (at
  15. # your option) any later version.
  16. #
  17. # GDebi is distributed in the hope that it will be useful,
  18. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20. # General Public License for more details.
  21. #
  22. # You should have received a copy of the GNU General Public License
  23. # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  24.  
  25. import sys
  26. import os
  27. import subprocess
  28. import string
  29. import apt
  30. import apt_pkg
  31. from PyKDE4.kdecore import *
  32. from PyKDE4.kdeui import *
  33. from PyQt4.QtCore import *
  34. from PyQt4.QtGui import *
  35.  
  36. import urllib
  37. import fcntl
  38. import posix
  39. import time
  40. import thread
  41. import re
  42. import pty
  43. import select
  44.  
  45. from DebPackage import DebPackage, Cache
  46. from apt.progress import InstallProgress
  47. from gettext import gettext as gett
  48.  
  49. def _(str):
  50.     return unicode(gett(str), 'UTF-8')
  51.  
  52. def utf8(str):
  53.   if isinstance(str, unicode):
  54.       return str
  55.   return unicode(str, 'UTF-8')
  56.  
  57. class KDEDpkgInstallProgress(object):
  58.     """The frontend for dpkg -i"""
  59.     #┬áthere is only 0/100 state for the progress bar
  60.  
  61.     def __init__(self, debfile, status, progress, konsole, parent):
  62.         # an expander would be handy, sadly we don't have one in KDE3
  63.         self.debfile = debfile
  64.         self.status = status
  65.         self.progress = progress
  66.         self.konsole = konsole
  67.         self.parent = parent
  68.         self.konsole.setInstallProgress(self)
  69.  
  70.         # in case there was some progress left from the deps
  71.         self.progress.setValue(0)
  72.  
  73.     def timeoutHandler(self,signum, frame):
  74.         raise IOError, "Stopped waiting for I/O."
  75.  
  76.     def commit(self):
  77.         # ui
  78.         self.status.setText(_("Installing '%s'...") % os.path.basename(self.debfile))
  79.         # the command
  80.         cmd = "/usr/bin/dpkg"
  81.         argv = [cmd, "-i", self.debfile]
  82.         (self.child_pid, self.master_fd) = pty.fork()
  83.  
  84.         if self.child_pid == 0:
  85.             os.environ["TERM"] = "dumb"
  86.             if not os.environ.has_key("DEBIAN_FRONTEND"):
  87.                 os.environ["DEBIAN_FRONTEND"] = "noninteractive"
  88.             os.environ["APT_LISTCHANGES_FRONTEND"] = "none"
  89.             exitstatus = subprocess.call(argv)
  90.             os._exit(exitstatus)
  91.         
  92.         while True:
  93.             #Read from pty and write to DumbTerminal
  94.             try:
  95.                 (rlist, wlist, xlist) = select.select([self.master_fd],[],[], 0.001)
  96.                 if len(rlist) > 0:
  97.                     line = os.read(self.master_fd, 255)
  98.                     self.parent.konsole.insertWithTermCodes(utf8(line))
  99.             except Exception, e:
  100.                 #print e
  101.                 # 11 == EAGAIN
  102.                 if e.errno == 11:
  103.                     continue
  104.                 break
  105.             KApplication.kApplication().processEvents()
  106.         # at this point we got a read error from the pty, that most
  107.         # likely means that the client is dead
  108.         (pid, status) = os.waitpid(self.child_pid, 0)
  109.         self.exitstatus = os.WEXITSTATUS(status)
  110.  
  111.         self.progress.setValue(100)
  112.         self.parent.closeButton.setEnabled(True)
  113.         self.parent.closeButton.setVisible(True)
  114.         self.parent.installationProgress.setVisible(False)
  115.         QTimer.singleShot(1, self.parent.changeSize)
  116.  
  117. class KDEInstallProgressAdapter(InstallProgress):
  118.     def __init__(self, progress, action, parent):
  119.         #┬áTODO: implement the term
  120.         InstallProgress.__init__(self)
  121.         self.progress = progress
  122.         self.action = action
  123.         self.parent = parent
  124.         self.finished = False
  125.         self.parent.konsole.setInstallProgress(self)
  126.  
  127.     def child_exited(self,process):
  128.         self.finished = True
  129.         self.apt_status = process.exitStatus()
  130.         self.finished = True
  131.  
  132.     def error(self, pkg, errormsg):
  133.         # FIXME: display a msg
  134.         #self.term_expander.set_expanded(True) #FIXME show konsole
  135.         pass
  136.  
  137.     def conffile(self, current, new):
  138.         # FIXME: display a msg or expand term
  139.         #self.term_expander.set_expanded(True) #FIXME show konsole
  140.         pass
  141.  
  142.     def startUpdate(self):
  143.         apt_pkg.PkgSystemUnLock()
  144.         self.action.setText(_("Installing dependencies..."))
  145.         self.progress.setValue(0)
  146.  
  147.     def statusChange(self, pkg, percent, status):
  148.         self.progress.setValue(percent)
  149.         #print status # mhb debug
  150.         #self.progress.setText(status) #FIXME set text
  151.  
  152.     def updateInterface(self):
  153.         # run the base class
  154.         try:
  155.             InstallProgress.updateInterface(self)
  156.         except ValueError,e:
  157.             pass
  158.         # log the output of dpkg (on the master_fd) to the DumbTerminal
  159.         while True:
  160.             try:
  161.                 (rlist, wlist, xlist) = select.select([self.master_fd],[],[], 0.01)
  162.                 # data available, read it
  163.                 if len(rlist) > 0:
  164.                     line = os.read(self.master_fd, 255)
  165.                     self.parent.konsole.insertWithTermCodes(utf8(line))
  166.                 else:
  167.                     # nothing happend within the timeout, break
  168.                     break
  169.             except Exception, e:
  170.                 #print "updateInterface: ", e
  171.                 break
  172.         KApplication.kApplication().processEvents()
  173.  
  174.     def fork(self):
  175.         """pty voodoo"""
  176.         (self.child_pid, self.master_fd) = pty.fork()
  177.         if self.child_pid == 0:
  178.             os.environ["TERM"] = "dumb"
  179.             if not os.environ.has_key("DEBIAN_FRONTEND"):
  180.                 os.environ["DEBIAN_FRONTEND"] = "noninteractive"
  181.             os.environ["APT_LISTCHANGES_FRONTEND"] = "none"
  182.         return self.child_pid
  183.  
  184.     def waitChild(self):
  185.         while True:
  186.             try:
  187.                 select.select([self.statusfd],[],[], self.selectTimeout)
  188.             except Exception, e:
  189.                 #print "waitChild: ", e
  190.                 pass
  191.             self.updateInterface()
  192.             (pid, res) = os.waitpid(self.child_pid,os.WNOHANG)
  193.             if pid == self.child_pid:
  194.                 #print "child exited: ", pid, os.WEXITSTATUS(res)
  195.                 break
  196.         return os.WEXITSTATUS(res)
  197.  
  198. class KDEFetchProgressAdapter(apt.progress.FetchProgress):
  199.     def __init__(self,progress,label,parent):
  200.         self.progress = progress
  201.         self.label = label
  202.         self.parent = parent
  203.  
  204.     def start(self):
  205.         self.label.setText(_("Downloading additional package files..."))
  206.         self.progress.setValue(0)
  207.  
  208.     def stop(self):
  209.         pass
  210.  
  211.     def pulse(self):
  212.         apt.progress.FetchProgress.pulse(self)
  213.         self.progress.setValue(self.percent)
  214.         currentItem = self.currentItems + 1
  215.         if currentItem > self.totalItems:
  216.             currentItem = self.totalItems
  217.         if self.currentCPS > 0:
  218.             self.label.setText(_("Downloading additional package files...") + _("File %s of %s at %sB/s" % (self.currentItems,self.totalItems,apt_pkg.SizeToStr(self.currentCPS))))
  219.         else:
  220.             self.label.setText(_("Downloading additional package files...") + _("File %s of %s" % (self.currentItems,self.totalItems)))
  221.         KApplication.kApplication().processEvents()
  222.         return True
  223.  
  224.     def mediaChange(self, medium, drive):
  225.         msg = _("Please insert '%s' into the drive '%s'") % (medium,drive)
  226.         #change = QMessageBox.question(None, _("Media Change"), msg, QMessageBox.Ok, QMessageBox.Cancel)
  227.         change = KMessageBox.questionYesNo(None, _("Media Change"), _("Media Change") + "<br>" + msg, KStandardGuiItem.ok(), KStandardGuiItem.cancel())
  228.         if change == KMessageBox.Yes:
  229.             return True
  230.         return False
  231.  
  232. class CacheProgressAdapter(apt.progress.FetchProgress):
  233.     def __init__(self, progressbar):
  234.         self.progressbar = progressbar
  235.  
  236.     def update(self, percent):
  237.         self.progressbar.show()
  238.         self.progressbar.setValue(percent)
  239.         KApplication.kApplication().processEvents()
  240.  
  241.     def done(self):
  242.         pass
  243.